/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica;
 
import Modelo.*;
import com.thoughtworks.xstream.XStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.*;
/**
 *
 * @author LuisCarvajal
 */
public class ControlBebe {
    XStream xs;
    String dir = System.getProperty("user.dir")+"/archivo/";
    
   

    /**
     * Carga la lista de bebé desde el archivo ArchivosUsuario.xml
     * 
     * @return Lista completa de los Bebés
     */
    public List<Bebe> getListaBebe ()
    {
        xs = new XStream();
        List<Bebe> bebes = new ArrayList<Bebe>();
        try {
            FileInputStream fis = new FileInputStream(dir+"ArchivosUsuario.xml");            
            bebes = (List<Bebe>)xs.fromXML(fis);            
            return (List<Bebe>) bebes;
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
        return null;
    }
    
    /**
     * Registra un nuevo bebé.
     * 
     * @return El ID del bebé que se acaba de insertar, si regresa 0 es por que ocurrio un error
     * @param Los datos del nuevo bebé
     */
    
    public int agregarBebe(String nombre, String apellido, String ci_padre, String fecha_nacimiento)
    {        
        List<Bebe> lista_bebe = this.getListaBebe();
        Bebe bebe = new Bebe();
        int id = lista_bebe.size();
        bebe.setId(id+1);
        bebe.setNombre(nombre);
        bebe.setApellido(apellido);
        bebe.setCi_padre(ci_padre);
        bebe.setFecha_nacimiento(fecha_nacimiento);
        lista_bebe.add(bebe);        
        xs = new XStream();
        try{
            FileOutputStream fs = new FileOutputStream(dir + "ArchivosUsuario.xml");
            xs.toXML(lista_bebe, fs);
            return id+1;
        } catch (FileNotFoundException e1){            
            e1.printStackTrace();
            return 0;
        }        
    }
    
    
    /**
     * Realiza una busqueda del bebé dao su ID
     * 
     * @return El bebé con el el ID deseado. Regresa null si no existe.
     * @param El id del bebé que se desea buscar
     */
    public Bebe buscaBebe(int id)
    {
        try{
        List<Bebe> lista_bebe = this.getListaBebe();
        Bebe bebe = (Bebe) lista_bebe.get(id-1);
        return bebe;
        }catch(Exception ex){
            return null;
        }
    }
 
    /**
     * Guarda el objeto consulta en la lista de consultas del bebé de ID deseado.
     * 
     * @param El objeto consulta y el id del bebé al que corresponde.
     * @return 1 la inserción se realizó con exito, 0 si ocurrió un error.
     */
    public int registrarConsulta(Consulta consulta,int id_bebe){
        List<Bebe> lista = getListaBebe(); 
        int id = id_bebe-1;        
        List<Consulta> consultas = lista.get(id).getLista_consulta();
        if (consultas!= null)
            consultas.add(consulta);
        else
        {
            consultas = new ArrayList<Consulta>();
            consultas.add(consulta);            
        }
        lista.get(id).setLista_consulta(consultas);        
        xs = new XStream();
        try{
            FileOutputStream fs = new FileOutputStream(dir + "ArchivosUsuario.xml");
            xs.toXML(lista, fs);
            return 1;
        } catch (FileNotFoundException e1){            
            e1.printStackTrace();
            return 0;
        } 
    }

    private boolean bebeIgual (Bebe bebe1, Bebe bebe2)
    {
        if ((bebe1.getNombre().equals(bebe2.getNombre()))&&(bebe1.getApellido().equals(bebe2.getApellido()))
           &&(bebe1.getCi_padre().equals(bebe2.getCi_padre()))&&(bebe1.getFecha_nacimiento().equals(bebe2.getFecha_nacimiento())))
            return true;
        else
            return false;
    }
    
    private boolean comparaConsulta (Consulta cons1,Consulta cons2)
    {
        if ((cons1.getCircunferencia_cefalica().equals(cons2.getCircunferencia_cefalica()))&&
           (cons1.getEdad().equals(cons2.getEdad()))&&(cons1.getEstatura().equals(cons2.getEstatura()))
         &&(cons1.getFecha().equals(cons2.getFecha()))&&(cons1.getPeso().equals(cons2.getPeso())))
            return true;
        else
            return false;
    }
    
    public List<Consulta> comparaListaConsulta(List<Consulta> cons1, List<Consulta> cons2)
    {
        boolean flag;
        List<Consulta> lista_result = new ArrayList<Consulta>();
        for (Consulta consulta : cons1) {
            flag=true;
            for (Consulta consulta1 : cons2) {
                if (this.comparaConsulta(consulta,consulta1))
                {
                    flag = false;
                }
            }
            if (flag == true)
                lista_result.add(consulta);            
        }
        return lista_result;
    }
    
    public void actualizarListaBebe (List<Modelo.Bebe> lista_Bebe) {
        List<Bebe> lista_anterior = this.getListaBebe();
        boolean flag = false; 
        for (Bebe bebe : lista_Bebe) {
            flag = false;
            for (Bebe bebe1 : lista_anterior) {
                if (this.bebeIgual(bebe, bebe1))
                {
                    flag = true;
                    if ((bebe.getLista_consulta()!=null)&&(bebe1.getLista_consulta()!=null)){
                        List<Consulta> lista_resultado = this.comparaListaConsulta(bebe.getLista_consulta(), bebe1.getLista_consulta());
                        for (Consulta consulta : lista_resultado) {
                            this.registrarConsulta(consulta, bebe1.getId());
                        }
                    }else
                    {
                        if (bebe.getLista_consulta()!=null)
                          for (Consulta cons : bebe.getLista_consulta())  
                              this.registrarConsulta(cons, bebe1.getId());
//                        if (bebe1.getLista_consulta()!=null)
//                          for (Consulta cons2 : bebe1.getLista_consulta())  
//                              this.registrarConsulta(cons2, bebe1.getId());
                    }
                }
            }
            if (flag == false)
            {
                this.agregarBebe(bebe.getNombre(), bebe.getApellido(), bebe.getCi_padre(),bebe.getFecha_nacimiento());
            }
        }
    }
}
